{
  // AppendArgument

  type AppendArgument<Func extends Function, Arg> = Func extends (
    ...args: infer Args
  ) => infer ReturnType
    ? (...args: [...Args, Arg]) => ReturnType
    : never;

  type res = AppendArgument<(a: string, b: number) => void, boolean>;

  // type res = (args_0: string, args_1: number, args_2: boolean) => void

  /**
   * 之前我们分别实现了参数和返回值的提取，那么重新构造就是用这些提取出的类型做下修改，构造一个新的类型即可。
   *
   * 比如在已有的函数类型上添加一个参数：
   *
   * 类型参数 Func 是待处理的函数类型，通过 extends 约束为 Function，Arg 是要添加的参数类型。
   *
   * 通过模式匹配提取参数到 infer 声明的局部变量 Args 中，提取返回值到局部变量 ReturnType 中。
   *
   * 用 Args 数组添加 Arg 构造成新的参数类型，结合 ReturnType 构造成新的函数类型返回。
   */
}

export {};
